Spring MVC常用的功能
1. 文件上传下载
A.必要条件
在WebMvcConfig.java中,添加处理 Multipart-formdata 的功能@Bean, 如下:
1
2
3
4
5
6
7
8
9
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
//做一些设置
multipartResolver.setDefaultEncoding("UTF-8");
multipartResolver.setMaxUploadSize(20*1024*1024);
multipartResolver.setMaxUploadSizePerFile(2*1024*1024); //单个文件不能超过2M
return multipartResolver;
}
B.文件上传操作
在前台的页面表单上,需要保证 form 表单的 method=post 以及 enctype=multipart/form-data
1
2
3
4
5<form action="${pageContext.request.contextPath}/upload" method="post"
enctype="multipart/form-data" name="uploadForm">
选择一个文件:<input type="file" name="uploadFile" accept="*/*">
<input type="submit" value="上传">
</form>在后台的控制器中,需要在参数中加上 MultipartFile 对象,并且参数名要与前台表单中 name属性值保持一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29"/upload") (value =
public String upload(MultipartFile uploadFile, Model model,
HttpSession session)
throws IOException {
log.debug("-- 上传的文件名:"+uploadFile.getOriginalFilename());
log.debug("-- 文件大小: "+uploadFile.getSize());
//
String originalFilename = uploadFile.getOriginalFilename();
int pos = originalFilename.lastIndexOf(".");
//原文件后缀名
String suffix = originalFilename.substring(pos);
//确定好服务端保存文件的具体位置
ServletContext context = session.getServletContext();
String realpath = context.getRealPath(UPLOAD_DIR);
//产生一个uuid式的随机文件名
String uuid = UUID.randomUUID().toString();
//构建目标的完整文件名
String fullname = realpath+ File.separator+uuid+suffix;
log.debug("** 目标文件名"+fullname);
//利用IO流进行读写,此处可以利用 commons-io中的工具类来快速完成
FileUtils.copyInputStreamToFile(uploadFile.getInputStream(), new File(fullname));
log.debug("-- 把上传的源文件COPY到目标文件完成....");
//把一个信息绑定到model中,以便在前端可以显示
model.addAttribute("originalFilename",originalFilename);
model.addAttribute("server_file_name",fullname);
model.addAttribute("filesize", uploadFile.getSize());
//
return "forward:/common/upload.jsp"; //不经过视图解析器
}
C.文件下载
需要注意的是设置响应内容类型和响应头,代码片断如下:
1 | "/download", method = RequestMethod.GET) (value = |
2.Bean Validation[后补充的笔记]
传统的写法
写起来代码量很大,且效率低下.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16String name = user.getName();
if(name == null || name.trim().equals("") ){
errors.put("name", "name不能为空!");
}else{
if(name.trim().length()>20 ){
errors.put("name", "name长度不能超过20!");
}else{
if(name 不满足某个格式){
errors.put("name", "name格式不正确!");
}else{
if(userService.getByName(name.trim()) != null){
errors.put("name", "用户名已被使用!");
}
}
}
}
- JSR-303 是JAVA EE 6 中的一项子规范,称为Bean Validation,官方参考实现是Hibernate Validator.
- 此实现与Hibernate ORM 没有任何关系, JSR303 用于对Java Bean 的属性值值进行验证。
- Spring MVC 支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
使用步骤
配置 pom.xml
1 | <!--JSR303--> |
配置 MessageSource
1 |
|
准备校验逻辑
- 彻底理解需求
- 整理请求参数列表
- 整理校验逻辑
准备资源文件
基于 i18n 国际化技术,需要提供多语言环境下的各种资源文件
validationMessages_en.properties
1 | user.name.invalid=Username must be between 6 and 12 |
validationMessages_zh.properties
1 | user.name.invalid=用户名必须在6到12之间 |
定义校验封装类
1 | import org.hibernate.validator.constraints.NotEmpty; |
控制器
1 | "add", method = RequestMethod.POST) (value = |
可自定义提供转换方法:
1 | /** |
页面
1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %> |
附录
JSR303提供
注解类 | 说明 |
---|---|
@Null | 必须为 null |
@NotNull | 必须不为 null |
@AssertTrue | 必须为 true |
@AssertFalse | 必须为 false |
@Min(value) | 必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 大小必须在指定的范围内 |
@Digits (integer, fraction) | 必须是一个数字,其值必须在可接受的范围内 |
@Past | 必须是一个过去的日期 |
@Future | 必须是一个将来的日期 |
@Pattern(value) | 必须符合指定的正则表达式 |
Hibernate Validator提供
注解类 | 说明 |
---|---|
必须是电子邮箱地址 | |
@Length | 字符串的长度必须在指定的范围内 |
@NotEmpty | 必须非空(有空格就不算Empty) |
@NotBlank | 字符串的必须非空(单纯空格算Blank) |
@Range | 必须在指定范围内 |
Spring MVC提供
注解类 | 说明 |
---|---|
@Valid | 数据需要校验 |
3.拦截器 【Interceptor】
主要就是要弄清楚 Filter、 Interceptor、 AOP三者的区别,以及各自的应用场景。
- Filter: 过滤器,主要是针对请求 的过滤,在容器层次上进行,保证“取你所需”
- Interceptor: 拦截器, 是过滤器的延伸,除了可以对请求操作外,还可以对 视图和模型进行拦截,是 “拒你所拒”
- AOP: 面向切面编程, 主要针对 业务层和持久层的代码织入,它是降低代码耦合度的一种很好的方式,基于动态代理